<?php
/* 
 * Sistema Fácil - Desenvolvimento rápido de softwares baseado em sentenças em português
 * Copyright (C) 2010 Rodrigo Caldeira de Paula Lima 
 * 
 * Este arquivo é parte do Sistema Fácil
 *
 * Sistema Fácil é um software livre; você pode redistribui-lo e/ou 
 * modifica-lo dentro dos termos da Licença Pública Geral GNU como 
 * publicada pela Fundação do Software Livre (FSF); na versão 2 da 
 * Licença, ou (na sua opnião) qualquer versão.
 * 
 * Este programa é distribuido na esperança que possa ser  util, 
 * mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer
 * MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
 * Licença Pública Geral GNU para maiores detalhes.
 *
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU
 * junto com este programa, se não, escreva para a Fundação do Software
 * Livre(FSF) Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
 * */

class Tabela {
	var $nome;
	var $campos;
	var $camposNaLista;
	var $camposParaAutenticacao;
	var $campoBemVindo;
	var $id;
	var $usarParaAutenticacao;
	var $restricoesListagem;
	var $usarParaRestricaoMenu;
	var $configBase;
	var $registrosPorPagina;
	var $paginaAtual;
	var $camposFiltro;
	var $campoParaExibicao;
	var $operacoesWorkflow;
	
	function __construct() {
		$this->campos = array();
		$this->camposNaLista = array();
		$this->camposParaAutenticacao = array();
		$this->usarParaAutenticacao = false;
		$this->usarParaRestricaoMenu = false;
		$this->registrosPorPagina = 0;
		$this->paginaAtual = 1;
		$this->camposFiltro = array();
		$this->campoParaExibicao = "";
		$this->operacoesWorkflow = array();
	}
	
	function criar($post) {
		$this->popularCampos($post);
		$query = "INSERT INTO `" . $this->nome . "` (";
		$camposParaInserir = "";
		$valoresParaInserir = "";
		foreach ($this->campos as $campo) {
			if (strpos($campo->tipoConfig, "Checagem de") !== FALSE) continue;
			if ($campo->valor != "") {
				$camposParaInserir .= "`" . $campo->nome . "`,";
				switch ($campo->tipoConfig) {
					case "Texto":
					case "Texto Grande":
					case "Data":
					case "Arquivo":
						$valoresParaInserir .= "'" . $campo->valor . "',";
						break;
					case "Número":
					case "Sim ou Não":
						$valoresParaInserir .= $campo->valor . ",";
						break;
					case "Número Decimal":
						$valoresParaInserir .= str_replace(",",".", $campo->valor) . ",";
						break;
					case "Senha":
						$valoresParaInserir .= "MD5('" . $campo->valor . "'),";
						break;
					default:
						$valoresParaInserir .= $campo->valor . ",";
						break;
				}
			}
		}
		$camposParaInserir = substr($camposParaInserir, 0, strlen($camposParaInserir) - 1);
		$valoresParaInserir = substr($valoresParaInserir, 0, strlen($valoresParaInserir) - 1);
		$query .= $camposParaInserir . ") VALUES (" . $valoresParaInserir . ")";
		//echo $query;
		mysql_query($query, $this->configBase->conn);
		$this->id = mysql_insert_id($this->configBase->conn);
		foreach ($this->campos as $campo) {
			if (strpos($campo->tipoConfig, "Checagem de") !== FALSE) {
				$nomeTabelaChecagem = trim(str_replace("Checagem de", "", $campo->tipoConfig));
				for ($i = 0; $i < count($campo->valor); $i++) {
					foreach ($this->configBase->tabelas as $tabela) {
						if ($tabela->nome == $nomeTabelaChecagem) {
							foreach ($tabela->campos as $campoTabelaChecagem) {
								if ($campoTabelaChecagem->tipoConfig == $this->nome) {
									$query = "UPDATE `" . $nomeTabelaChecagem . "` SET `" . $campoTabelaChecagem->nome . "` = " . $this->id . " WHERE id = " . $campo->valor[$i];
									//echo $query;
									mysql_unbuffered_query($query, $this->configBase->conn);
									break;
								}
							}
							break;
						}
					}
				}
			}		
		}
		if ($this->usarParaRestricaoMenu) {
			$this->atualizarRestricaoMenu($post);
		}
		$this->executarWorkflow();
		$this->salvarArquivos();
	}
	
	function atualizar($post) {
		$this->id = $post['id'];
		$this->popularCampos($post);
		$query = "UPDATE `" . $this->nome . "` SET ";
		$camposParaAtualizar = "";
		foreach ($this->campos as $campo) {
			if (strpos($campo->tipoConfig, "Checagem de") !== FALSE) {
				$nomeTabelaChecagem = trim(str_replace("Checagem de", "", $campo->tipoConfig));
				$query = "UPDATE `" . $nomeTabelaChecagem . "` SET `" . $this->nome . "` = 0 WHERE `" . $this->nome . "` = " . $this->id;
				//echo $query;
				mysql_unbuffered_query($query, $this->configBase->conn);
				for ($i = 0; $i < count($campo->valor); $i++) {
					foreach ($this->configBase->tabelas as $tabela) {
						if ($tabela->nome == $nomeTabelaChecagem) {
							foreach ($tabela->campos as $campoTabelaChecagem) {
								if ($campoTabelaChecagem->tipoConfig == $this->nome) {
									$query = "UPDATE `" . $nomeTabelaChecagem . "` SET `" . $campoTabelaChecagem->nome . "` = " . $this->id . " WHERE id = " . $campo->valor[$i];
									//echo $query;
									mysql_unbuffered_query($query, $this->configBase->conn);
									break;
								}
							}
							break;
						}
					}
				}
				//print_r($campo->valor);
				continue;
			}
			$campo->verificarCondicoes();
			if (($campo->tipoConfig == "Senha" && $campo->valor == "SENHAPADRAO") || !$campo->exibir) continue;
			$camposParaAtualizar .= "`" . $campo->nome . "` = ";
			switch ($campo->tipoConfig) {
				case "Texto":
				case "Texto Grande":
				case "Data":
				case "Arquivo":
					$camposParaAtualizar .= "'" . $campo->valor . "',";
					break;
				case "Número":
				case "Sim ou Não":
				case "Número Decimal":
					if ($campo->valor == "") $campo->valor = 0;
					$camposParaAtualizar .= $campo->valor . ",";
					break;
				case "Senha":
					if ($campo->valor == "") continue;
					$camposParaAtualizar .= "MD5('" . $campo->valor . "'),";
					break;
				default:
					if ($campo->valor == "") $campo->valor = 0;
					$camposParaAtualizar .= $campo->valor . ",";
					break;
			}
		}
		$camposParaAtualizar = substr($camposParaAtualizar, 0, strlen($camposParaAtualizar) - 1);
		$query .= $camposParaAtualizar . " WHERE id = " . $this->id;
		//echo $query;
		mysql_unbuffered_query($query, $this->configBase->conn);
		if ($this->usarParaRestricaoMenu) {
			$this->atualizarRestricaoMenu($post);
		}
		$this->executarWorkflow();
		$this->salvarArquivos();
	}
	
	function executarWorkflow() {
		foreach ($this->operacoesWorkflow as $operacaoWorkflow) {
			$operacaoWorkflow->executar();
		}
	}
	
	function atualizarRestricaoMenu($post) {
		//print_r($post);
		$query = "DELETE FROM `" . $this->nome . "_X_Menu` WHERE `" . $this->nome . "Id` = " . $this->id;
		mysql_unbuffered_query($query, $this->configBase->conn);
		$query = "INSERT INTO `" . $this->nome . "_X_Menu` VALUES ";
		foreach ($post['restricaoMenu'] as $menu) {
			$query .= "(" . $this->id . ",'" . $menu . "',";
			$query .= ($post['criar'][$menu]) . ",";
			$query .= ($post['alterar'][$menu]) . ",";
			$query .= ($post['excluir'][$menu]);
			$query .= "),";
		}
		$query = substr($query, 0, strlen($query) - 1);
		//echo $query;
		mysql_unbuffered_query($query, $this->configBase->conn);
	}
	
	function excluir($id) {
		$query = "DELETE FROM `" . $this->nome . "` WHERE id = " . $id;
		mysql_unbuffered_query($query, $this->configBase->conn); 
	}
	
	function buscarDados() {
		$query = "SELECT * FROM `" . $this->nome . "` WHERE id=" . $this->id;
		$result = mysql_query($query, $this->configBase->conn);
		$registros = mysql_fetch_array($result);
		$this->id = $registros['id'];
		foreach ($this->campos as $campo) {
			if ($campo->tipo !== NULL) {
				$campo->valor = $registros[$campo->nome];
			}
		}
	}
	
	function renderizarCamposRestricaoMenu() {
		$conteudo = "Restrições de acesso aos menus:<br/>";
		$menusRestritos = array();
		if ($this->id) {
			$query = "SELECT menu, criar, alterar, excluir FROM `" . $this->nome . "_X_Menu` WHERE `" . $this->nome . "Id` = " . $this->id;
			$result = mysql_query($query, $this->configBase->conn);
			$i = 0;
			while ($registro = mysql_fetch_array($result)) {
				$menusRestritos[$i] = array();
				$menusRestritos[$i]["tabela"] = $registro["menu"];
				$menusRestritos[$i]["criar"] = $registro["criar"];
				$menusRestritos[$i]["alterar"] = $registro["alterar"];
				$menusRestritos[$i]["excluir"] = $registro["excluir"];
				$i++;
			}
		}
		foreach ($this->configBase->tabelas as $tabela) {
			$checkedTabela = "";
			$checkedCriar = "";
			$checkedAlterar = "";
			$checkedExcluir = "";
			foreach ($menusRestritos as $menu) {
				if ($menu["tabela"] == $tabela->nome) {
					$checkedTabela = "checked='checked'";
					if ($menu["criar"]) $checkedCriar = "checked='checked'";
					if ($menu["alterar"]) $checkedAlterar = "checked='checked'";
					if ($menu["excluir"]) $checkedExcluir = "checked='checked'";
				}
			}
			$conteudo .= "<input type='hidden' name='criar[" . $tabela->nome . "]' value='0'/>";
			$conteudo .= "<input type='hidden' name='alterar[" . $tabela->nome . "]' value='0'/>";
			$conteudo .= "<input type='hidden' name='excluir[" . $tabela->nome . "]' value='0'/>";
			$conteudo .= "<label><input type='checkbox' name='restricaoMenu[]' value='" . $tabela->nome . "' $checkedTabela onclick='javascript:habilitaPermissoes(\"" . str_replace(" ", "_", $tabela->nome) . "\",this.checked);'/>" . $tabela->nome . "</label>&nbsp;&nbsp;&nbsp;&nbsp;";
			$conteudo .= "<label id='criar_" . str_replace(" ", "_", $tabela->nome) . "'><input type='checkbox' class='permissoes_" . str_replace(" ", "_", $tabela->nome) . "' name='criar[" . $tabela->nome . "]' value='1' $checkedCriar/> criar</label>";
			$conteudo .= "<label id='alterar_" . str_replace(" ", "_", $tabela->nome) . "'><input type='checkbox' class='permissoes_" . str_replace(" ", "_", $tabela->nome) . "' name='alterar[" . $tabela->nome . "]' value='1' $checkedAlterar/> alterar</label>";
			$conteudo .= "<label id='excluir_" . str_replace(" ", "_", $tabela->nome) . "'><input type='checkbox' class='permissoes_" . str_replace(" ", "_", $tabela->nome) . "' name='excluir[" . $tabela->nome . "]' value='1' $checkedExcluir/> excluir</label>";
			$conteudo .= "<script type='text/javascript'>habilitaPermissoes('" . str_replace(" ", "_", $tabela->nome) . "'," . (empty($checkedTabela) ? "false" : "true") . ");</script>";
			$conteudo .= "<br/>";
		}
		return $conteudo;
	}
	
	function popularCampos($post) {
		foreach ($_FILES as $nomeCampo => $file) {
			foreach ($this->campos as $campo) {
				if ($nomeCampo == str_replace(" ", "_", $this->nome . "_" . $campo->nome)) {
					$campo->valor = $file["name"];
					break;
				}
			}
		}
		foreach ($post as $campoDoForm => $valorDoForm) {
			//echo $campoDoForm . " = " . $valorDoForm . "<br/>";
			foreach ($this->campos as $campo) {
				if ($campoDoForm == str_replace(" ", "_", $this->nome . "_" . $campo->nome)) {
					if (strpos($campo->tipoConfig, "Checagem de") !== FALSE) {
						$campo->valor = $valorDoForm;
					} else {
						switch ($campo->tipoConfig) {
							case "Sim ou Não":
								$campo->valor = $valorDoForm[0];
								break;
							case "Número Decimal":
								$campo->valor = str_replace(",",".",$valorDoForm);
								break;
							case "Expressão Numérica":
								$campo->valor .= $campo->executarExpressao();
								break;
							case "Data":
								$campo->valor = $valorDoForm;
								break;
							default:
								$campo->valor = htmlentities($valorDoForm, ENT_QUOTES);
								break;
						}
					}
				}
			}
		}
	}
	
	function salvarArquivos() {
		if (!is_dir($this->configBase->pathUpload . "/" . $this->nome)) {
			mkdir($this->configBase->pathUpload . "/" . $this->nome);
		}
		if (!is_dir($this->configBase->pathUpload . "/" . $this->nome . "/" . $this->id)) {
			mkdir($this->configBase->pathUpload . "/" . $this->nome . "/" . $this->id);
		}
		$pathUpload = $this->configBase->pathUpload . "/" . $this->nome . "/" . $this->id . "/";
		foreach ($_FILES as $file) {
			move_uploaded_file($file['tmp_name'], $pathUpload . $file['name']);
		}
	}
	
	function verificarValores() {
		foreach ($this->campos as $campo) {
			if ($campo->valor == "" && $campo->valorPadrao) {
				$campo->analisarValorPadrao();
			}
		}
	}
}
?>